package com.administrator.scoreManageSys.utils;


import com.administrator.scoreManageSys.system.SystemConstant;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Header;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import static com.administrator.scoreManageSys.system.SystemConstant.SYSTEM_USER_ROLE;

/**
 * jwt token 工具类
 * @author Administrator
 */
public class JwtTokenUtils {

    /**
     * 生成用户登录凭证token
     *
     * @param userId     用户ID
     * @param roleId     当前用户的角色Id
     * @param expire     到期时间 （单位毫秒）
     * @return token字符串
     */
    public static String generateAuthenticationToken(Long userId, Long roleId , Long expire) {

        //信息载体
        Map<String, Object> claims = new HashMap<String, Object>(2);
        //获取6位随机数
        String randomKey = NumberUtils.getRandomString(6);
        //设置MD5 加密随机数
        claims.put(SystemConstant.MD5_RANDOM_KEY, randomKey);
        //设置头部
        Map<String, Object> header = new HashMap<String, Object>(1);
        header.put(SYSTEM_USER_ROLE, roleId);
        //创建jwt
        return Jwts.builder()
                .setClaims(claims)
                //设置头部信息
                .setHeader(header)
                //设置该JWT所面向的用户
                .setSubject(String.valueOf(userId))
                //设置签名
                .signWith(SignatureAlgorithm.HS256, SystemConstant.JWT_TOKEN_KEY)
                .compact();
    }

    /**
     * 从token中获取用户ID
     *
     * @param token 用户token
     * @return
     */
    public static String getUserIdFromToken(String token) {
        return getClaimFromToken(token).getSubject();
    }

    /**
     * 从token中获取用户角色ID
     *
     * @param token 用户token
     * @return
     */
    public static Long getUserRoleIdFromToken(String token) {
        return Long.valueOf(getHeaderFromToken(token).get(SYSTEM_USER_ROLE).toString());
    }

    /**
     * 从token中 获取MD5 加密随机数
     *
     * @param token
     * @return
     */
    public static String getMd5KeyFromToken(String token) {
        return getClaimFromToken(token).get(SystemConstant.MD5_RANDOM_KEY).toString();
    }

    /**
     * 从token中 获取jwt的payload部分(载荷就是存放有效信息的地方)
     *
     * @param token
     * @return
     */
    public static Claims getClaimFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(SystemConstant.JWT_TOKEN_KEY)
                .parseClaimsJws(token)
                .getBody();
    }

    /**
     * 从token中 获取jwt的header部分(头部文件)
     *
     * @param token
     * @return
     */
    public static Header getHeaderFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(SystemConstant.JWT_TOKEN_KEY)
                .parseClaimsJws(token)
                .getHeader();
    }

}
